/**
 * 全局样式默认值
 * 说明：统一管理常见的样式属性，避免在各处重复硬编码
 * - label：节点文字样式（字号、粗细、颜色、对齐）
 * - portDot：端口(连接桩)圆点样式（半径、可吸附、描边、填充、显隐、鼠标样式）
 * - loop：泳道的标题栏高度与内容区内边距、圆角
 */
export const WORKFLOW_STYLE_DEFAULTS = {
    label: {
        fontSize: 14,
        fontWeight: 600,
        color: '#FFFFFF',
        refX: 70,
        refY: '50%',
        textVerticalAnchor: 'middle'
    },
    portDot: {
        r: 4,
        magnet: true,
        stroke: '#C2C8D5',
        fill: '#C2C8D5',
        style: {visibility: 'hidden', cursor: 'crosshair'}
    },
    loop: {
        headerHeight: 30,
        innerPadding: 8,
        cornerRadius: 8
    }
}

/**
 * 工作流组件注册器
 * 提供统一的组件注册和管理机制
 */
class ComponentRegistry {
    constructor() {
        this.nodeComponents = new Map()
        this.edgeComponents = new Map()
        this.toolComponents = new Map()
        this.drawerComponents = new Map()
    }

    /**
     * 注册节点组件
     * @param {string} type - 节点类型
     * @param {Object} config - 节点配置
     * @param {Object} component - Vue组件
     */
    registerNode(type, config, component) {
        this.nodeComponents.set(type, {config, component})
    }

    /**
     * 注册边组件
     * @param {string} type - 边类型
     * @param {Object} config - 边配置
     * @param {Object} component - Vue组件
     */
    registerEdge(type, config, component) {
        this.edgeComponents.set(type, {config, component})
    }

    /**
     * 注册工具栏组件
     * @param {string} type - 工具类型
     * @param {Object} config - 工具配置
     * @param {Object} component - Vue组件
     */
    registerTool(type, config, component) {
        this.toolComponents.set(type, {config, component})
    }

    /**
     * 注册抽屉组件
     * @param {string} type - 抽屉类型
     * @param {Object} component - Vue组件
     */
    registerDrawer(type, component) {
        this.drawerComponents.set(type, component)
    }

    /**
     * 获取所有节点类型配置
     * @returns {Array} 节点配置列表（包含type字段，过滤 hidden=true 的类型）
     */
    getNodeTypes() {
        return Array.from(this.nodeComponents.entries())
            .filter(([_, item]) => item?.config?.hidden !== true)
            .map(([type, item]) => ({
                type: type,
                ...item.config
            }))
    }

    /**
     * 获取节点组件
     * @param {string} type - 节点类型
     * @returns {Object} 节点组件
     */
    getNodeComponent(type) {
        return this.nodeComponents.get(type)?.component
    }

    /**
     * 获取节点配置
     * @param {string} type - 节点类型
     * @returns {Object} 节点配置
     */
    getNodeConfig(type) {
        return this.nodeComponents.get(type)?.config
    }

    /**
     * 获取抽屉组件
     * @param {string} type - 抽屉类型
     * @returns {Object} 抽屉组件
     */
    getDrawerComponent(type) {
        return this.drawerComponents.get(type)
    }

    /**
     * 获取所有工具栏组件
     * @returns {Array} 工具栏组件列表
     */
    getToolComponents() {
        return Array.from(this.toolComponents.values())
    }

    /**
     * 获取所有插件类型配置
     * @returns {Array} 插件配置列表（包含type字段）
     */
    getToolTypes() {
        return Array.from(this.toolComponents.entries()).map(([type, item]) => ({
            type: type,
            ...item.config
        }))
    }

    /**
     * 获取插件配置
     * @param {string} type - 插件类型
     * @returns {Object} 插件配置
     */
    getToolConfig(type) {
        return this.toolComponents.get(type)?.config
    }
}

// 创建全局注册器实例
export const componentRegistry = new ComponentRegistry()

